RAPPORT-ATL-6
MicroServices ?
Les microservices, ou micro-services en français, sont une architecture logicielle qui consiste à diviser une application en petits services autonomes et indépendants les uns des autres. Chaque microservice est conçu pour accomplir une tâche spécifique de manière efficace et peut être développé, déployé et mis à l'échelle indépendamment des autres services.
Les mots clés importants dans cette définition sont:
- architecture logicielle: l'organisation des composants logiciels pour construire une application
- petits services autonomes: des composants logiciels qui fonctionnent indépendamment les uns des autres
- indépendants les uns des autres: chaque service peut être développé, déployé et mis à l'échelle sans affecter les autres services
- tâche spécifique: chaque service a une fonction précise
- efficace: les microservices sont conçus pour être optimisés et performants
En résumé, les microservices permettent de créer des applications modulaires, évolutives et résilientes en divisant l'application en petits composants indépendants qui peuvent être développés et déployés de manière autonome.

Part 1
1- Création d’un simple service web SOAP (Hello World) en utilisant l'API JAX-WS et apache AXIS2(Voir Annexe JAX-WS)
- Configurations file
pom.xml:
<dependencies>
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>JAX-WS est une API de programmation Java pour créer des services web basés sur SOAP. Elle permet aux applications de communiquer via des messages XML. JAX-WS est couramment utilisé pour les services web d'entreprise.
- Create HelloWorld service :
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class HelloWorldService {
@WebMethod
public String sayHello(String name) {
return "Hello, " + name + "!";
}
}Le code ci-dessus est un exemple de création d'un service web en utilisant JAX-WS. Voici une explication détaillée :
- Le service web est défini dans la classe "HelloWorldService".
• Le service web est annoté avec
@WebServicequi indique que cette classe est un point d'entrée pour les requêtes de service web. • L'annotation@SOAPBinding(style = SOAPBinding.Style.RPC)spécifie que le style RPC (Remote Procedure Call) sera utilisé pour la communication entre le client et le service web. • La méthodesayHello()est annotée avec@WebMethodqui indique que cette méthode est exposée en tant que point d'entrée du service web. • Cette méthode prend une chaîne de caractères en tant qu'argument et renvoie une chaîne de caractères qui contient le message de salutation.
- Pubblish Endpoint :
public class WebServicePublisher {
public static void main(String[] args) {
System.out.println("The server now is running");
System.out.println("Check this link for wsdl : http://localhost:8080/hello?wsdl");
Endpoint.publish("http://localhost:8080/hello", new HelloWorldService());
}
}Le code ci-dessus est un exemple de publication d'un service web JAX-WS en utilisant la classe Endpoint. Voici une explication détaillée :
- La classe WebServicePublisher contient une méthode main() qui sera exécutée pour publier le service web.
• Le message "The server now is running" sera affiché sur la console pour indiquer que le serveur est en cours d'exécution.
• Le message "Check this link for wsdl : http://localhost:8080/hello?wsdl" sera affiché sur la console pour indiquer l'URL du fichier WSDL (Web Services Description Language) qui décrit le service web publié.
• La méthode
Endpoint.publish()est appelée pour publier le service web. Elle prend deux arguments : l'URL à laquelle le service web doit être publié et une instance de la classe HelloWorldService qui implémente le service web.
Testing the Soap service :
2 - Créez un simple service web REST (Hello World) en utilisant l'API JAX-RS et apache AXIS2 (Voir Annexe JAX-RS) :
- Configurations file
pom.xml:
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.34</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.34</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-cdi2-se</artifactId>
<version>2.34</version>
</dependency>
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se-core</artifactId>
<version>3.1.8.Final</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-servlet-initializer</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>
<!-- RESTEasy Client Dependency -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>${resteasy.version}</version>
</dependency>
</dependencies>- Create model :
@XmlRootElement
public class HelloWorld {
private String message;
public HelloWorld() {}
public HelloWorld(String message) {
super();
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}Le code ci-dessus est un exemple de création d'un modèle de données en utilisant JAXB (Java Architecture for XML Binding). Voici une explication détaillée :
- La classe HelloWorld est annotée avec
@XmlRootElementqui indique que cette classe peut être sérialisée en XML. • La classe HelloWorld contient un champ message de type String qui sera sérialisé en tant qu'élément XML. • La classe HelloWorld contient un constructeur sans paramètres et un constructeur avec un paramètre message. • La classe HelloWorld contient des méthodes getters et setters pour le champ message.
- Create Ressources class :
@Path("hello")
public class HelloWorldResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response helloWorld() {
HelloWorld helloWorld = new HelloWorld("Hello World !");
return Response.ok(helloWorld).build();
}
}Le code ci-dessus est un exemple de création d'une ressource RESTful en utilisant JAX-RS. Voici une explication détaillée :
- La classe HelloWorldResource est annotée avec
@Path("hello")qui spécifie l'URL de base pour cette ressource. • La méthode helloWorld() est annotée avec@GETqui spécifie que cette méthode répondra à une requête HTTP GET. • La méthode helloWorld() est annotée avec@Produces(MediaType.APPLICATION_JSON)qui spécifie que cette méthode renverra une réponse au format JSON. • La méthode helloWorld() crée une instance de la classe HelloWorld avec le message "Hello World!". • La méthode helloWorld() renvoie une réponse HTTP OK avec l'objet HelloWorld sérialisé en JSON.
- Create Service Class :
@ApplicationPath("/restapi")
public class RestEasyServices extends Application {
private Set < Object > singletons = new HashSet < Object > ();
public RestEasyServices() {
singletons.add(new HelloWorldResource());
}
@Override
public Set < Object > getSingletons() {
return singletons;
}
}Le code ci-dessus est un exemple de configuration d'une application JAX-RS en utilisant la classe Application. Voici une explication détaillée :
- La classe RestEasyServices est annotée avec
@ApplicationPath("/restapi")qui spécifie l'URL de base pour les ressources JAX-RS de cette application. • La classe RestEasyServices étend la classe Application qui est une classe de base pour les applications JAX-RS. • La classe RestEasyServices contient un champ singletons de type Set<Object> qui contient les instances de toutes les ressources JAX-RS à publier. • Le constructeur de la classe RestEasyServices ajoute une instance de la classe HelloWorldResource à la liste des ressources à publier. • La méthodegetSingletons()de la classe RestEasyServices renvoie la liste des instances de ressources JAX-RS à publier.
Testing the Rest App :
- Deploy the app in tomcat 8.5.88
- Test the Hello World web service using Postman Or By going to the link:
- Open Postman and create a new request.
- Set the request method to
GETand the URL tohttp://localhost:8080/<ArtifactName>/<ApplicationPath>/<Path>/
- get the request and verify that the response is "Hello, World!".

Part 2
Hello World service web SOAP using spring boot
- Add dependency to the project
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> </dependency> </dependencies>
- WSDL file
Un fichier
WSDL(Web Services Description Language) est un document XML qui décrit les fonctionnalités offertes par un service web.Le fichier
WSDLest utilisé par les clients de service web pour comprendre comment interagir avec le service.<?xml version="1.0" encoding="ISO-8859-1"?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://ynabouzi.me" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://ynabouzi.me" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.xmlsoap.org/wsdl/soap/ "> <wsdl:types> <xs:schema targetNamespace="http://ynabouzi.me"> <xs:element name="inputSOATest"> <xs:complexType> <xs:sequence> <xs:element type="xs:string" name="test"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="outputSOATest"> <xs:complexType> <xs:sequence> <xs:element type="xs:string" name="result"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> </wsdl:types> <!--Define input and output parameters --> <wsdl:message name="inputSOATest"> <wsdl:part name="in" element="tns:inputSOATest"/> </wsdl:message> <wsdl:message name="outputSOATest"> <wsdl:part name="out" element="tns:outputSOATest"/> </wsdl:message> <!--Define port definition --> <wsdl:portType name="SOATestEndpoint"> <wsdl:operation name="SOATest"> <wsdl:input message="tns:inputSOATest"/> <wsdl:output message="tns:outputSOATest"/> </wsdl:operation> </wsdl:portType> <!--Bind Soap operation and service --> <wsdl:binding name="SOATestBinding" type="tns:SOATestEndpoint"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="SOATest"> <soap:operation soapAction="http://ynabouzi.me" style="document"/> <wsdl:input> <soap:body parts="in" use="literal"/> </wsdl:input> <wsdl:output> <soap:body parts="out" use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <!--Define service --> <wsdl:service name="SOATestEndpointService"> <wsdl:port name="SOATestEndpoint" binding="tns:SOATestBinding"> <soap:address location="http://localhost:8080/javainuse/ws/helloWorldExample"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
- Web Service Configuration
@EnableWs @Configuration public class WebServiceConfig extends WsConfigurerAdapter { @Bean public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) { MessageDispatcherServlet servlet = new MessageDispatcherServlet(); servlet.setApplicationContext(applicationContext); return new ServletRegistrationBean(servlet, "/soap-api/ws/*"); } @Bean(name="helloworld") public Wsdl11Definition defaultWsdl11Definition() { SimpleWsdl11Definition wsdl11Definition = new SimpleWsdl11Definition(); wsdl11Definition.setWsdl(new ClassPathResource("/wsdl/helloworld.wsdl")); return wsdl11Definition; } }Cette class configure un service web SOAP en utilisant Spring Web Services (Spring WS). L'annotation
@EnableWsest utilisée pour activer le support de Spring WS dans l'application. La classeWebServiceConfigétendWsConfigurerAdapterpour fournir des méthodes de configuration supplémentaires pour Spring WS. La méthodemessageDispatcherServlet()configure un servlet de dispatching de messages pour Spring WS. Elle utilise la classeMessageDispatcherServletfournie par Spring WS et définit son contexte d'application à partir de l'objetApplicationContextfourni. Elle retourne un objetServletRegistrationBeanqui enregistre le servlet pour le chemin d'URL "/soap-api/ws/*". La méthodedefaultWsdl11Definition()configure la définition WSDL par défaut pour le service web. Elle crée un objetSimpleWsdl11Definitionqui lit le fichier WSDL à partir de la ressource de chemin de classe "/wsdl/helloworld.wsdl".
- Web Service Endpoint
@Endpoint public class WebServiceEndpoint { private static final String NAMESPACE_URI = "http://ynabouzi.me"; @PayloadRoot(namespace = NAMESPACE_URI, localPart = "inputSOATest") @ResponsePayload public OutputSOATest hello(@RequestPayload InputSOATest request) { String outputString = "Hello " + request.getTest() + "!"; ObjectFactory factory = new ObjectFactory(); OutputSOATest response = factory.createOutputSOATest(); response.setResult(outputString); return response; } }Cette classe Java est un point d'extrémité de service Web annoté avec
@Endpoint. Sa méthodehelloprend une requête d'entrée de type InputSOATest et renvoie une réponse de sortie de type OutputSOATest. -NAMESPACE_URIis a constant string used to define the namespace URI for the XML schema. -@PayloadRootannotation is used to map the incoming request to a specific method in the endpoint class based on the namespace and local part of the request's root element. -@ResponsePayloadannotation is used to specify that the method return value should be used as the response payload.
- Spring Boot Application
@SpringBootApplication public class SpringBootHelloWorldApplication { public static void main(String[] args) { SpringApplication.run(SpringBootHelloWorldApplication.class, args); } }
- Test The Web Service with Postman
- Open Postman and create a new request.
- Set the request method to
POSTand the URL tohttp://localhost:8080/soap-api/ws/helloworld.wsdl
- Add a request header with key
Content-Typeand valuetext/xml.
- Add a request header with key
SOAPActionand value"#POST".
- In the request body, add the following XML:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:jav="http://ynabouzi.me"> <soapenv:Header/> <soapenv:Body> <jav:inputSOATest> <test></test> </jav:inputSOATest> </soapenv:Body> </soapenv:Envelope>
- Send the request and verify that the response is "Hello, + name!".
Result

Ressources
- JAVA REST DOC : HERE
- JAVA SOPA DOC : HERE
- JAVA SOPA-SPRING DOC : HERE
- SOURCE CODE : HERE
Made with Love 🦢
by @NBGamer

